package com.salud.mendoza;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Created by ricardo on 09/06/14.
 */
public class IFaceCSVParser {
    private CSVManager csvManager = CSVManager.getInstance();
    private Logger logger = Logger.getLogger("IFaceCSVParser");
    private MySQLManager mySQLManager = MySQLManager.getInstance();

    public List<String[]> leerFichadas(String nombreArchivo) {
        //String path = PropertiesManager.getProperty("directorioFichadas");
        return csvManager.readFile(nombreArchivo);
    }


    public void escribirFichadas(String nombreArchivo, List<String[]> valores) {
        //String path = PropertiesManager.getProperty("directorioFichadas");
        csvManager.writeFile(nombreArchivo, valores);
    }

    public List<String[]> calcularIngreso(String nombreArchivo) {
        logger.log(Level.INFO, "Iniciando Parseo");
        //Cargar fichada
        List<String[]> fichadasIface = leerFichadas(nombreArchivo);
        SimpleDateFormat simpleDateFormatIface = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat simpleDateFormatSistema = new SimpleDateFormat("dd-MM-yyyy HH:mm");
        Integer documento = null;
        Date fechaHora = null;
        List<String[]> fichadasSistema = new ArrayList<String[]>();
        for (String[] fichadaIface : fichadasIface) {
            //String[] fichada = fichadasIface.get(0);
            try {
                if (fichadaIface[5].equals("I") || fichadaIface[6].equals("O")) {
                    documento = Integer.parseInt(fichadaIface[0]);
                    fechaHora = simpleDateFormatIface.parse(fichadaIface[1]);
                    TipoDeRegistro tipoDeRegistro = buscarHorarioDePersona(documento, fechaHora);
                    if (tipoDeRegistro == null) tipoDeRegistro = TipoDeRegistro.ENTRADA;
                    String[] fichadaSistema = new String[4];
                    fichadaSistema[0] = String.format("%010d", documento);
                    fichadaSistema[1] = simpleDateFormatSistema.format(fechaHora);
                    fichadaSistema[2] = tipoDeRegistro == TipoDeRegistro.ENTRADA ? "E" : "S";
                    fichadaSistema[3] = "001";
                    fichadasSistema.add(fichadaSistema);
                }
            } catch (ParseException e) {
                logger.log(Level.WARNING, "Error al formatear la fecha: " + fichadaIface[3]);
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
                //break;
            }

        }
        return fichadasSistema;
    }

    public TipoDeRegistro buscarHorarioDePersona(Integer documento, Date fechaHora) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(fechaHora);
        String dia_de_la_semana = null;
        //System.out.println("fechaHora=>" + fechaHora + " ======== dia de la semana " + calendar.get(Calendar.DAY_OF_WEEK));
        switch (calendar.get(Calendar.DAY_OF_WEEK)) {
            case 1:
                dia_de_la_semana = "Lunes";
                break;
            case 2:
                dia_de_la_semana = "Martes";
                break;
            case 3:
                dia_de_la_semana = "Miércoles";
                break;
            case 4:
                dia_de_la_semana = "Jueves";
                break;
            case 5:
                dia_de_la_semana = "Viernes";
                break;
            case 6:
                dia_de_la_semana = "Sábado";
                break;
            case 0:
                dia_de_la_semana = "Domingo";
                break;
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String fecha = simpleDateFormat.format(fechaHora);

        //TODO buscar un dia antes y un dia despues

        String sql_buscar_horario_fijo = "select f.hora, f.total_horas from " +
                "global_2010.t_per_personal p, t_config_hora_fijo f where p.id = f.id_persona and  f.cerrado=0 and f.hora <> \"\" and f.anulado=0 and f.tipo=\"E\" " +
                "and f.dia_nom=\"" + dia_de_la_semana + "\" and p.n_documento=" + documento;
        //"select f.hora, f.total_horas from global_2010.t_per_personal p, t_config_hora_fijo f where p.id = f.id_persona and  f.cerrado=0 and f.hora <> \"\" and f.anulado=0 and f.tipo=\"E\" and f.dia_nom=\"Viernes\"  and p.n_documento= 27612753";
        //System.out.println(sql_buscar_horario_fijo);

        String sql_buscar_horario_variable = "select v.hora, v.total_horas from " +
                "global_2010.t_per_personal p, t_config_hora_var v where p.id = v.id_persona and v.cerrado=0 and v.hora <> \"\" and v.anulado=0 and v.tipo=\"E\" and" +
                " p.n_documento=" + documento + " and v.fecha=" + fecha;
        //System.out.println(sql_buscar_horario_variable);

        ResultSet horarioFijo = mySQLManager.consultar(sql_buscar_horario_fijo);
        ResultSet horarioVariable = mySQLManager.consultar(sql_buscar_horario_variable);

        Date fechaDiagramaEntrada;
        Date fechaDiagramaSalida;

        SimpleDateFormat simpleDateFormatHora = new SimpleDateFormat("HH:mm");
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        Long diffMin = null;
        TipoDeRegistro tipoDeRegistro = null;
        Boolean conDiagrama = false;

        try {
            while (horarioFijo.next()) {
                /*

                fechaDiagramaEntrada = simpleDateFormatHora.parse(horarioFijo.getString("f.hora"));
                //System.out.println(fechaDiagramaEntrada);
                fechaDiagramaEntrada.setTime(calendar.getTimeInMillis() + fechaDiagramaEntrada.getTime());

                fechaDiagramaSalida = simpleDateFormatHora.parse(horarioFijo.getString("f.total_horas"));
                //System.out.println(fechaDiagramaSalida);
                fechaDiagramaSalida.setTime(fechaDiagramaEntrada.getTime() + fechaDiagramaSalida.getTime());

                Long diffEntrada = Math.abs(fechaHora.getTime() - fechaDiagramaEntrada.getTime());
                Long diffSalida = Math.abs(fechaHora.getTime() - fechaDiagramaSalida.getTime());

                */

                GregorianCalendar calendarEntrada = new GregorianCalendar();
                calendarEntrada.setTime(calendar.getTime());

                String horaEntrada = horarioFijo.getString("f.hora");
                String totalHoras = horarioFijo.getString("f.total_horas");

                calendarEntrada.set(Calendar.HOUR_OF_DAY, Integer.parseInt(horaEntrada.substring(0, 2)));
                calendarEntrada.set(Calendar.MINUTE, Integer.parseInt(horaEntrada.substring(3, 5)));

                GregorianCalendar calendarSalida = new GregorianCalendar();
                calendarSalida.setTime(calendarEntrada.getTime());

                calendarSalida.add(Calendar.HOUR_OF_DAY, Integer.parseInt(totalHoras.substring(0, 2)));
                calendarSalida.add(Calendar.MINUTE, Integer.parseInt(totalHoras.substring(3, 5)));

                Long diffEntrada = Math.abs(calendar.getTime().getTime() - calendarEntrada.getTime().getTime());
                Long diffSalida = Math.abs(calendar.getTime().getTime() - calendarSalida.getTime().getTime());


                if (diffMin == null) {
                    diffMin = diffEntrada;
                    tipoDeRegistro = TipoDeRegistro.ENTRADA;
                }

                if (diffMin >= diffEntrada) {
                    diffMin = diffEntrada;
                    tipoDeRegistro = TipoDeRegistro.ENTRADA;
                }
                if (diffMin > diffSalida) {
                    diffMin = diffSalida;
                    tipoDeRegistro = TipoDeRegistro.SALIDA;
                }

                //System.out.println(diffMin);
                System.out.println("\t{[dni] " + documento + " [Hora] " + fechaHora + "} [E] " + calendarEntrada.getTime() + " [S] " + calendarSalida.getTime() + " Tipo ==> " + tipoDeRegistro);
            }
            horarioFijo.close();
            while (horarioVariable.next()) {
                //System.out.println(calendar.getTime());

                fechaDiagramaEntrada = simpleDateFormatHora.parse(horarioVariable.getString("f.hora"));
                //System.out.println(fechaDiagramaEntrada);
                fechaDiagramaEntrada.setTime(calendar.getTimeInMillis() + fechaDiagramaEntrada.getTime());

                fechaDiagramaSalida = simpleDateFormatHora.parse(horarioVariable.getString("f.total_horas"));
                //System.out.println(fechaDiagramaSalida);
                fechaDiagramaSalida.setTime(fechaDiagramaEntrada.getTime() + fechaDiagramaSalida.getTime());

                Long diffEntrada = Math.abs(fechaHora.getTime() - fechaDiagramaEntrada.getTime());
                Long diffSalida = Math.abs(fechaHora.getTime() - fechaDiagramaSalida.getTime());

                if (diffMin == null) {
                    diffMin = diffEntrada;
                    tipoDeRegistro = TipoDeRegistro.ENTRADA;
                }

                if (diffMin >= diffEntrada) {
                    diffMin = diffEntrada;
                    tipoDeRegistro = TipoDeRegistro.ENTRADA;
                }
                if (diffMin > diffSalida) {
                    diffMin = diffSalida;
                    tipoDeRegistro = TipoDeRegistro.SALIDA;
                }

                //System.out.println(diffMin);
                System.out.println("\t[documento]" + documento + " [Hora]" + fechaHora + " [Hora de Entrada]" + fechaDiagramaEntrada + " [Hora de Salida]" + fechaDiagramaSalida);
            }
            horarioVariable.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return tipoDeRegistro;
    }


}
